home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- __revision__ = '$Id: clientstream.py 680 2008-08-21 06:24:42Z jajcus $'
- __docformat__ = 'restructuredtext en'
- from hashlib import sha1
- import logging
- from pyxmpp.iq import Iq
- from pyxmpp.utils import to_utf8, from_utf8
- from pyxmpp.jid import JID
- from pyxmpp.clientstream import ClientStream
- from pyxmpp.jabber.register import Register
- from pyxmpp.exceptions import ClientStreamError, LegacyAuthenticationError, RegistrationError
-
- class LegacyClientStream(ClientStream):
-
- def __init__(self, jid, password = None, server = None, port = 5222, auth_methods = ('sasl:DIGEST-MD5', 'digest'), tls_settings = None, keepalive = 0, owner = None):
- (self.authenticated, self.available_auth_methods, self.auth_stanza, self.peer_authenticated, self.auth_method_used, self.registration_callback, self.registration_form, self._LegacyClientStream__register) = (None, None, None, None, None, None, None, None)
- ClientStream.__init__(self, jid, password, server, port, auth_methods, tls_settings, keepalive, owner)
- self._LegacyClientStream__logger = logging.getLogger('pyxmpp.jabber.LegacyClientStream')
-
-
- def _reset(self):
- ClientStream._reset(self)
- self.available_auth_methods = None
- self.auth_stanza = None
- self.registration_callback = None
-
-
- def _post_connect(self):
- if not self.initiator:
- if 'plain' in self.auth_methods or 'digest' in self.auth_methods:
- self.set_iq_get_handler('query', 'jabber:iq:auth', self.auth_in_stage1)
- self.set_iq_set_handler('query', 'jabber:iq:auth', self.auth_in_stage2)
-
- elif self.registration_callback:
- iq = Iq(stanza_type = 'get')
- iq.set_content(Register())
- self.set_response_handlers(iq, self.registration_form_received, self.registration_error)
- self.send(iq)
- return None
-
- ClientStream._post_connect(self)
-
-
- def _post_auth(self):
- ClientStream._post_auth(self)
- if not self.initiator:
- self.unset_iq_get_handler('query', 'jabber:iq:auth')
- self.unset_iq_set_handler('query', 'jabber:iq:auth')
-
-
-
- def _try_auth(self):
- if self.authenticated:
- self._LegacyClientStream__logger.debug('try_auth: already authenticated')
- return None
-
- self._LegacyClientStream__logger.debug('trying auth: %r' % (self._auth_methods_left,))
- if not self._auth_methods_left:
- raise LegacyAuthenticationError, 'No allowed authentication methods available'
-
- method = self._auth_methods_left[0]
- if method.startswith('sasl:'):
- return ClientStream._try_auth(self)
- elif method not in ('plain', 'digest'):
- self._auth_methods_left.pop(0)
- self._LegacyClientStream__logger.debug('Skipping unknown auth method: %s' % method)
- return self._try_auth()
- elif self.available_auth_methods is not None:
- self._auth_methods_left.pop(0)
- if method in self.available_auth_methods:
- self.auth_method_used = method
- if method == 'digest':
- self._digest_auth_stage2(self.auth_stanza)
- else:
- self._plain_auth_stage2(self.auth_stanza)
- self.auth_stanza = None
- return None
- else:
- self._LegacyClientStream__logger.debug('Skipping unavailable auth method: %s' % method)
- return self._try_auth()
- else:
- self._auth_stage1()
-
-
- def auth_in_stage1(self, stanza):
- self.lock.acquire()
-
- try:
- if 'plain' not in self.auth_methods and 'digest' not in self.auth_methods:
- iq = stanza.make_error_response('not-allowed')
- self.send(iq)
- return None
-
- iq = stanza.make_result_response()
- q = iq.new_query('jabber:iq:auth')
- q.newChild(None, 'username', None)
- q.newChild(None, 'resource', None)
- if 'plain' in self.auth_methods:
- q.newChild(None, 'password', None)
-
- if 'digest' in self.auth_methods:
- q.newChild(None, 'digest', None)
-
- self.send(iq)
- iq.free()
- finally:
- self.lock.release()
-
-
-
- def auth_in_stage2(self, stanza):
- self.lock.acquire()
-
- try:
- if 'plain' not in self.auth_methods and 'digest' not in self.auth_methods:
- iq = stanza.make_error_response('not-allowed')
- self.send(iq)
- return None
-
- username = stanza.xpath_eval('a:query/a:username', {
- 'a': 'jabber:iq:auth' })
- if username:
- username = from_utf8(username[0].getContent())
-
- resource = stanza.xpath_eval('a:query/a:resource', {
- 'a': 'jabber:iq:auth' })
- if resource:
- resource = from_utf8(resource[0].getContent())
-
- if not username or not resource:
- self._LegacyClientStream__logger.debug('No username or resource found in auth request')
- iq = stanza.make_error_response('bad-request')
- self.send(iq)
- return None
-
- if stanza.xpath_eval('a:query/a:password', {
- 'a': 'jabber:iq:auth' }):
- if 'plain' not in self.auth_methods:
- iq = stanza.make_error_response('not-allowed')
- self.send(iq)
- return None
- else:
- return self._plain_auth_in_stage2(username, resource, stanza)
-
- if stanza.xpath_eval('a:query/a:digest', {
- 'a': 'jabber:iq:auth' }):
- if 'plain' not in self.auth_methods:
- iq = stanza.make_error_response('not-allowed')
- self.send(iq)
- return None
- else:
- return self._digest_auth_in_stage2(username, resource, stanza)
- finally:
- self.lock.release()
-
-
-
- def _auth_stage1(self):
- iq = Iq(stanza_type = 'get')
- q = iq.new_query('jabber:iq:auth')
- q.newTextChild(None, 'username', to_utf8(self.my_jid.node))
- q.newTextChild(None, 'resource', to_utf8(self.my_jid.resource))
- self.send(iq)
- self.set_response_handlers(iq, self.auth_stage2, self.auth_error, self.auth_timeout, timeout = 60)
- iq.free()
-
-
- def auth_timeout(self):
- self.lock.acquire()
-
- try:
- self._LegacyClientStream__logger.debug('Timeout while waiting for jabber:iq:auth result')
- if self._auth_methods_left:
- self._auth_methods_left.pop(0)
- finally:
- self.lock.release()
-
-
-
- def auth_error(self, stanza):
- self.lock.acquire()
-
- try:
- err = stanza.get_error()
- ae = err.xpath_eval('e:*', {
- 'e': 'jabber:iq:auth:error' })
- if ae:
- ae = ae[0].name
- else:
- ae = err.get_condition().name
- raise LegacyAuthenticationError, 'Authentication error condition: %s' % (ae,)
- finally:
- self.lock.release()
-
-
-
- def auth_stage2(self, stanza):
- self.lock.acquire()
-
- try:
- self._LegacyClientStream__logger.debug('Procesing auth response...')
- self.available_auth_methods = []
- if stanza.xpath_eval('a:query/a:digest', {
- 'a': 'jabber:iq:auth' }) and self.stream_id:
- self.available_auth_methods.append('digest')
-
- if stanza.xpath_eval('a:query/a:password', {
- 'a': 'jabber:iq:auth' }):
- self.available_auth_methods.append('plain')
-
- self.auth_stanza = stanza.copy()
- self._try_auth()
- finally:
- self.lock.release()
-
-
-
- def _plain_auth_stage2(self, _unused):
- iq = Iq(stanza_type = 'set')
- q = iq.new_query('jabber:iq:auth')
- q.newTextChild(None, 'username', to_utf8(self.my_jid.node))
- q.newTextChild(None, 'resource', to_utf8(self.my_jid.resource))
- q.newTextChild(None, 'password', to_utf8(self.password))
- self.send(iq)
- self.set_response_handlers(iq, self.auth_finish, self.auth_error)
- iq.free()
-
-
- def _plain_auth_in_stage2(self, username, _unused, stanza):
- password = stanza.xpath_eval('a:query/a:password', {
- 'a': 'jabber:iq:auth' })
- if password:
- password = from_utf8(password[0].getContent())
-
- if not password:
- self._LegacyClientStream__logger.debug('No password found in plain auth request')
- iq = stanza.make_error_response('bad-request')
- self.send(iq)
- return None
-
- if self.check_password(username, password):
- iq = stanza.make_result_response()
- self.send(iq)
- self.peer_authenticated = True
- self.auth_method_used = 'plain'
- self.state_change('authorized', self.peer)
- self._post_auth()
- else:
- self._LegacyClientStream__logger.debug('Plain auth failed')
- iq = stanza.make_error_response('bad-request')
- e = iq.get_error()
- e.add_custom_condition('jabber:iq:auth:error', 'user-unauthorized')
- self.send(iq)
-
-
- def _digest_auth_stage2(self, _unused):
- iq = Iq(stanza_type = 'set')
- q = iq.new_query('jabber:iq:auth')
- q.newTextChild(None, 'username', to_utf8(self.my_jid.node))
- q.newTextChild(None, 'resource', to_utf8(self.my_jid.resource))
- digest = sha1(to_utf8(self.stream_id) + to_utf8(self.password)).hexdigest()
- q.newTextChild(None, 'digest', digest)
- self.send(iq)
- self.set_response_handlers(iq, self.auth_finish, self.auth_error)
- iq.free()
-
-
- def _digest_auth_in_stage2(self, username, _unused, stanza):
- digest = stanza.xpath_eval('a:query/a:digest', {
- 'a': 'jabber:iq:auth' })
- if digest:
- digest = digest[0].getContent()
-
- if not digest:
- self._LegacyClientStream__logger.debug('No digest found in digest auth request')
- iq = stanza.make_error_response('bad-request')
- self.send(iq)
- return None
-
- (password, pwformat) = self.get_password(username)
- if not password or pwformat != 'plain':
- iq = stanza.make_error_response('bad-request')
- e = iq.get_error()
- e.add_custom_condition('jabber:iq:auth:error', 'user-unauthorized')
- self.send(iq)
- return None
-
- mydigest = sha1(to_utf8(self.stream_id) + to_utf8(password)).hexdigest()
- if mydigest == digest:
- iq = stanza.make_result_response()
- self.send(iq)
- self.peer_authenticated = True
- self.auth_method_used = 'digest'
- self.state_change('authorized', self.peer)
- self._post_auth()
- else:
- self._LegacyClientStream__logger.debug('Digest auth failed: %r != %r' % (digest, mydigest))
- iq = stanza.make_error_response('bad-request')
- e = iq.get_error()
- e.add_custom_condition('jabber:iq:auth:error', 'user-unauthorized')
- self.send(iq)
-
-
- def auth_finish(self, _unused):
- self.lock.acquire()
-
- try:
- self._LegacyClientStream__logger.debug('Authenticated')
- self.authenticated = True
- self.state_change('authorized', self.my_jid)
- self._post_auth()
- finally:
- self.lock.release()
-
-
-
- def registration_error(self, stanza):
- self.lock.acquire()
-
- try:
- err = stanza.get_error()
- ae = err.xpath_eval('e:*', {
- 'e': 'jabber:iq:auth:error' })
- if ae:
- ae = ae[0].name
- else:
- ae = err.get_condition().name
- raise RegistrationError, 'Authentication error condition: %s' % (ae,)
- finally:
- self.lock.release()
-
-
-
- def registration_form_received(self, stanza):
- self.lock.acquire()
-
- try:
- self._LegacyClientStream__register = Register(stanza.get_query())
- self.registration_callback(stanza, self._LegacyClientStream__register.get_form())
- finally:
- self.lock.release()
-
-
-
- def submit_registration_form(self, form):
- self.lock.acquire()
-
- try:
- if form and form.type != 'cancel':
- self.registration_form = form
- iq = Iq(stanza_type = 'set')
- iq.set_content(self._LegacyClientStream__register.submit_form(form))
- self.set_response_handlers(iq, self.registration_success, self.registration_error)
- self.send(iq)
- else:
- self._LegacyClientStream__register = None
- finally:
- self.lock.release()
-
-
-
- def registration_success(self, stanza):
- _unused = stanza
- self.lock.acquire()
-
- try:
- self.state_change('registered', self.registration_form)
- if 'FORM_TYPE' in self.registration_form and self.registration_form['FORM_TYPE'].value == 'jabber:iq:register':
- if 'username' in self.registration_form:
- self.my_jid = JID(self.registration_form['username'].value, self.my_jid.domain, self.my_jid.resource)
-
- if 'password' in self.registration_form:
- self.password = self.registration_form['password'].value
-
-
- self.registration_callback = None
- self._post_connect()
- finally:
- self.lock.release()
-
-
-
-